'''
面向对象有三大特征：封装 继承 多态
封装：
    1）目的是为了隐藏内部细节，对外提供一个接口，
    这样，既可以减少外部对内部实现的依赖，也可以防止外部直接访问内部信息，从而保证数据的安全性和完整性
    2）为了让外部不能直接访问属性，可以使用封装的思路
    3）步骤：
       --》（1）将属性私有化 __属性名 类的外面就不能通过对象.属性去修改属性值了
       --》（2）对外提供两类方法set/get,分别用来修改属性和获取属性
'''

class Dog:
    type = "拉布拉多"

    def __init__(self,name,age):
        self.__name = name
        self.__age = age

    def setName(self,name):
        self.__name = name

    def setAge(self,age):
        # 需要对年龄进行限定
        if age <0:
            self.__age =0
        elif age > 10:
            self.__age = 10
        else:
            self.__age = age
    # 获取属性值
    def getName(self):
        return self.__name
    def getAge(self):
        return self.__age

    def run(self):
        print(f"{self.__name} 四条腿狂奔")

    def __str__(self):
        return f"{self.__name} 的品种为{Dog.type},年龄为{self.__age}"


bai = Dog("小白",5)
Dog.type = "金毛"

# bai.__name = "小黑"  #不能通过该方式进行属性修改和获取
# bai.__age = -600
bai.setAge(-45) # 通过set方法修改属性
print(bai)
print(bai.getAge())
